import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class sushu {
    public static void main(String [] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        long start = System.currentTimeMillis();
        Queue q = 优埃氏筛法(n);
        long end=System.currentTimeMillis();
        int k = q.size();
        System.out.println(q);
        System.out.println("耗时"+(end-start)+"毫秒");
    }
    //优化前的
    public static Queue<Integer>埃氏筛法(int n ){
        Queue<Integer> q = new LinkedList<Integer>();
        int[] st = new int [n + 1];
        Arrays.fill(st, 0);
        for(int i = 2;i <= n;i ++){
            //如果st[i] = 0说明小于i的值中没有能够除尽i的约数，如果有的话就会将后面同类型的也除尽。比如说4，4可以被2除尽
            //到四的时候就没必要再运行，因为能被四除尽的一定可以被2除尽！
            if(st[i] != 1 )
                for(int j = 2 * i;j <= n;j += i){
                    st[j] = 1;
                }
        }
        for(int i = 1;i <= n; i ++ ){
            if(st[i] == 0)
                q.add(i);
        }
        return q;
    }
    //优化后的埃氏筛法！
    public static Queue<Integer> 优埃氏筛法(int n){
        Queue<Integer> q = new LinkedList<Integer>();

        int[] st = new int[n + 1];
        Arrays.fill(st, 0);
        for(int i = 2;i <= n/i;i ++){
            if(st[i] == 0 )
                //每次从i倍开始筛！因为i-1倍在之前都被筛除了！
                for(int j = i * i;j <= n;j += i){
                    st[j] = 1;
                }
        }
        for(int i = 1;i <= n;i ++){
            if(st[i] != 1) q.add(i);
        }
        return q;
    }
    //效率最高的欧拉筛，又称线性筛，筛出每个质数的倍数！
    //确保每个合数被最小质因数筛掉，或者是被合数的最大质因数筛掉！
    public static Queue<Integer>欧拉筛法(int n){
        Queue<Integer> q = new LinkedList<Integer>();
        int cnt = 0;
        int[] st = new int[n + 1];
        int[] pr = new int[n + 1];

        for(int i = 2;i <= n;i ++){
            if(st[i] == 0){
                pr[cnt ++] = i;
            }
            for(int j = 0;pr[j] <= n/i;j ++){ //确保质数的i倍小于或等于n的！
                st[ pr[j] * i ] = 1;
                //这个是数学推导！
                if(i % pr[j] == 0)
                    break; //当i=4时，pr{2，3}，如果不结束内层循环，12会被3*4晒出，i == 6的话又会被2 * 6筛出！
            }
        }
        for(int i = 1;i <= n;i ++){
            if(st[i] != 1)
                q.add(i);
        }
        return q;
    }











}
